home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.OpenProm / sun4c.md / getidprom.c < prev    next >
C/C++ Source or Header  |  1991-07-30  |  6KB  |  224 lines

  1. /* 
  2.  * getidprom.c --
  3.  *
  4.  *    This module provides idprom support.
  5.  *
  6.  * Copyright 1989 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/src/boot/netBoot.OpenProm/sun4c.md/RCS/getidprom.c,v 1.1 91/01/13 02:52:18 dlong Exp $ SPRITE (Berkeley)";
  18. #endif /* not lint */
  19.  
  20. #include "boot.h"
  21.  
  22.  
  23. /*
  24.  *----------------------------------------------------------------------
  25.  *
  26.  * SearchProm --
  27.  *
  28.  *    Search through the prom devices to find out system attributes.
  29.  *    Modified version of function of same name in devGraphics.c,
  30.  *     also allows displaying attributes of the whole tree if
  31.  *    name and attr are given as "*".  If attr is given, and name
  32.  *    is "*", the info will be retrieved from the first node with
  33.  *    that attribute.
  34.  *
  35.  * Results:
  36.  *    length of info retrieved.
  37.  *
  38.  *----------------------------------------------------------------------
  39.  */
  40. #ifdef sun4c
  41. static int
  42. SearchProm(node, name, attr, buf, buflen)
  43.     unsigned    int        node;
  44.     char    *name;
  45.     char    *attr;
  46.     char    *buf;
  47.     int        buflen;
  48. {
  49.     unsigned    int        newNode;
  50.     char     searchBuffer[64];
  51.     int        length = 0;
  52.     struct    config_ops    *configPtr;
  53.     ReturnStatus        ret;
  54.     char    *prop;
  55.  
  56.     configPtr = romVectorPtr->v_config_ops;
  57.     while (node != 0) {
  58.     length = configPtr->devr_getproplen(node, "name");
  59.     if (length > 0) {
  60.         if (length > sizeof (searchBuffer)) {
  61.         panic("SearchProm: buffer too small.\n");
  62.         }
  63.         configPtr->devr_getprop(node, "name", searchBuffer);
  64.         if (strcmp("*", name) == 0 && strcmp("*", attr) == 0) {
  65.         prop = 0;
  66.         while (1) {
  67.             prop = (char *)configPtr->devr_nextprop(node, prop);
  68.             if (prop && *prop) {
  69.             if (strcmp(prop, attr) == 0
  70.                 || strcmp(prop, "*") == 0) {
  71.                 printf("%s: %s\n", searchBuffer, prop);
  72.             } 
  73.             printf("%s: %s\n", searchBuffer, prop);
  74.             } else {
  75.             break;
  76.             }
  77.         }
  78.         }
  79.         else if (strcmp(searchBuffer, name) == 0
  80.             || strcmp(name, "*") == 0) {
  81.         length = configPtr->devr_getproplen(node, attr);
  82.         if (length <= 0) {
  83.             printf("No %s found for %s in prom.\n", attr, name);
  84.         } else if (length > buflen) {
  85.             printf("Data size (%d) is greater than buffer size (%d)\n",
  86.             length, buflen);
  87.         } else {
  88.             configPtr->devr_getprop(node, attr, buf);
  89.         }
  90.         return length;
  91.         }
  92.     }
  93.     newNode = configPtr->devr_child(node);
  94.     ret = SearchProm(newNode, name, attr, buf, buflen);
  95.     if (ret > 0) {
  96.         return ret;
  97.     }
  98.     node = configPtr->devr_next(node);
  99.     }
  100.     return 0;
  101. }
  102. #endif /* sun4c */
  103.  
  104.  
  105. /*
  106.  *----------------------------------------------------------------------
  107.  *
  108.  * GetIDProm --
  109.  *
  110.  *    Get IDPROM information in a machine independent way.
  111.  *
  112.  * Results:
  113.  *    IDPROM info.
  114.  *
  115.  * Side effects:
  116.  *    None.
  117.  *
  118.  *----------------------------------------------------------------------
  119.  */
  120. int
  121. GetIDProm(buf, buflen)
  122.     char    *buf;
  123.     int        buflen;
  124. {
  125. #ifdef sun4c
  126.     struct    config_ops    *configPtr;
  127.     unsigned    int        node;
  128.  
  129.     configPtr = romVectorPtr->v_config_ops;
  130.     /*
  131.      * Find the idprom:  First get the root node id of the tree of
  132.      * devices in the prom.  Then traverse it depth-first to find
  133.      * the idprom.  Use "*" because we aren't sure what type of
  134.      * machine it is, and the "idprom" is a property of the root
  135.      * node, which is the machine type.  I guess we don't need to
  136.      * traverse the tree, since it is at the root node, but
  137.      * Sun might put it somewhere else in the next PROM version!
  138.      */
  139.     node = configPtr->devr_next(0);
  140.  
  141. #ifdef traverse_tree_debug
  142.     (void) SearchProm(node, "*", "*", NULL, 0);
  143. #endif
  144.     return SearchProm(node, "*", "idprom", buf, buflen);
  145. #else
  146.     return -1;
  147. #endif /* sun4c */
  148. }
  149.  
  150. #ifdef sun4c
  151. ShowProm()
  152. {
  153.     struct    config_ops    *configPtr;
  154.     unsigned    int        node;
  155.     configPtr = romVectorPtr->v_config_ops;
  156.  
  157.     node = configPtr->devr_next(0);
  158.     ShowNode(node);
  159.     ShowMemList();
  160. }
  161.  
  162. ShowNode(node)
  163.     unsigned    int        node;
  164. {
  165.     unsigned    int        newNode;
  166.     char     nameBuffer[128], valueBuffer[128];
  167.     int        length = 0;
  168.     int        vlength;
  169.     struct    config_ops    *configPtr;
  170.     ReturnStatus        ret;
  171.     char    *prop;
  172.  
  173.     configPtr = romVectorPtr->v_config_ops;
  174.     while (node != 0) {
  175.     length = configPtr->devr_getproplen(node, "name");
  176.     if (length > 0) {
  177.         configPtr->devr_getprop(node, "name", nameBuffer);
  178.         {
  179.         prop = 0;
  180.         while (1) {
  181.             prop = (char *)configPtr->devr_nextprop(node, prop);
  182.             if (prop && prop[0]) {
  183.             unsigned int intVal;
  184.             configPtr->devr_getprop(node, prop, valueBuffer);
  185.             vlength = configPtr->devr_getproplen(node, prop);
  186.             bcopy(valueBuffer, (char *) &intVal, sizeof(int));
  187.             valueBuffer[vlength] = 0;
  188.                 printf("%s: %s = 0x%x \"%s\"", nameBuffer, prop,
  189.                         intVal, valueBuffer);
  190.             } else {
  191.             break;
  192.             }
  193.         }
  194.         }
  195.     }
  196.     newNode = configPtr->devr_child(node);
  197.     ret = ShowNode(newNode);
  198.     node = configPtr->devr_next(node);
  199.     }
  200.     return 0;
  201. }
  202.  
  203. ShowMemList()
  204. {
  205.     int  buflen;
  206.     struct memlist mlist[16];
  207.  
  208.     struct    config_ops    *configPtr;
  209.     unsigned    int        node;
  210.     int        length, i;
  211.     configPtr = romVectorPtr->v_config_ops;
  212.  
  213.     node = configPtr->devr_next(0);
  214.  
  215.     length = SearchProm(node, "memory", "available", (char *) mlist, 
  216.                 sizeof(mlist));
  217.     for (i = 0; i < length / sizeof(struct memlist); i++) {
  218.     printf("memlist[%d], next = 0x%x addr = 0x%x, size = %d\n",
  219.         i, mlist[i].next, mlist[i].address, mlist[i].size);
  220.     }
  221.  
  222. }
  223. #endif
  224.